# macd高级验证
# 1、MACD上穿0轴，MACD 上穿0轴，又称指数平滑异同平均线上穿0轴，其特征是：
#   MACD翘头向上穿过0轴，由负值变为正值。
#   MACD上穿0轴的图形如图1所示。从技术上来 讲，MACD上穿0轴表示价格的走势开始进入强势，投资者可以看多并做多。
#   MACD上穿0轴是投资者看多的依据，
#   特别是月MACD上穿0，表明价格将有一大段的升幅，投资者可以及时买进。todo 需要后期完善(2) 可用在总体股筛选

# 2、 MACD下穿0轴，又称指数平滑异同平均线下穿0轴，其特征是：
#   MACD弯头向上穿过0轴，由正值变为负值。
#   MACD下穿0轴的图形如图2所示。从技术上说，MACD下穿0轴 表示价格的走势开始进入弱势，投资者要看空做空，在反弹时及时逢高卖出。
#   提醒：MACD下穿0轴是投资者看空的依据，
#   特别是月MACD下穿0轴，表明价格 将有一大段的跌幅，投资者要及时清仓离场。todo 需要后期完善(3)

# macd 由负转正 适时买进 diff>dea 并且 > 0 博取短价抢反弹 建仓  + 并结合其他信息判断大方向买入
# macd 由负转正 适时买进 diff>dea 并且 < 0 博取短价抢反弹 建仓  + 并结合其他信息判断大方向买入
# 3、 MACD 调头向上，又称指数平滑异同平均线调头向上，其特征是：
#  向下移动的DIFF线开始调头向上移动，并且向上穿过DEA线时产生了“黄金交叉”。
#  MACD调头向上既可以发生在正值区域，即在0轴上方运行。出现MACD调整向上，通常表示震荡回调结束，这时投资者可以适时买进
#  MACD调头向上也可以发生在负值区域，即在0轴下方运行。出现MACD调整向上，表示反弹开始，这时投资者可以适时买进，博取短价，即抢反弹

# diff 掉头示警 正值区域 diff向下穿过dea 回避风险观望
# diff 掉头示警 负值区域 diff向下穿过dea 清空
# 4、 MACD 调头向下，又称指数平滑异同平均线调头向下，其特征是：
#  向上移动的DIFF线开始调头向下移动，并且向下穿过DEA线时产生了“死亡交叉”。
#  MACD调头 向下可以发生在正值区域，即在0轴上方运行。出现MACD调整向下，通常表示震荡回调开始，为了回避风险，投资者还是退出观望为好，
#  调头向下也可以发生在负值区域，即在0轴下方运行。出现MACD调整向下，表示反弹结束，这时投资者要果断抛空
#  特别是月MACD调头向下 **** todo 需要后期完善(1)

# 顶背离周期如何确定 5分钟、15分钟、30分钟、60分钟k线 周期太长作为当天的操作指标
# 5、MACD与价格项背离，又称指数平滑异同平均线与价格顶背离，其特征是：
#  价格逐波上涨，但MACD技术指标不是同步上升，而是逐波下跌。
#  MACD与价格顶背离的图形如图7所示。从 技术上来讲，MACD与价格顶背离预示着价格一轮升势已完成，短期内很可能见顶，
#  特别是价格己有大幅拉升后.如果时MACD再出现死亡交叉，则见顶大幅回落的可能性更大。
#  我们可以结合什么是adx指标来进行分析，
#  投资者这时要做好准备离场或先减仓，一旦价格趋势向下，果断清仓。

# 6、 MACD与价格底背离，又称指数平滑异同平均线与价格底背离，其特征是:
#   价格逐波下跌，但MACD指标线不是同步下降，而是逐波走高。
#   MACD与价格底背离的图形如图8所示。从技术上来讲，MACD与价格底背离预示着价格一轮跌势己完成，短期内很可能见底，
#   特别是价格己有大幅下跌后，如果时MACD再出现黄金交叉，则见底回升的可能性更大。投资者这时要做好准备进场，也可以利用少量资金先进场。
#   提醒：价格在高位时，通常出现一次顶背离，就可以确认见顶;而价格在低位时，可能需要出现几次底背离才能确认见底，
#   还要注意，某一时间周期背离，其他时间不背离，这很可能是假背离，如日K线图背离，而周K线图和月K线图不背离。


import os
from utils import date_util, read_config, json_util, macd_util_v1, k_util, excel_util, doc_util


# 验证月macd上穿0线
def month_macd_valid(list_s, date):
    result_path = os.path.join(read_config.data_path, 'result', '月macd', date, '历史验证')
    check_out_list = []
    for s_info in list_s:
        s_info = json_util.to_json(s_info)
        code = s_info['code']
        name = s_info['name']
        macd_list = macd_util_v1.get_macd_list(code, date_util.get_date_str(), 1000, 30)
        macd_list.reverse()
        flag = 0  # 0: 开始 -1:监控向下穿过0 1:监控向上穿过0
        change_list = []
        for macd_info in macd_list:
            macd_info = json_util.to_json(macd_info)
            macd = macd_info['macd']
            if flag == -1 and macd <= 0:
                print('向下穿过0轴')
                print(macd_info)
                macd_info['form'] = '\\'
                change_list.append(macd_info)
                flag = 1
            elif flag == 1 and macd >= 0:
                print('向上穿过0轴')
                print(macd_info)
                macd_info['form'] = '/'
                change_list.append(macd_info)
                flag = -1
            elif flag == 0 and macd >= 0:
                flag = -1
            elif flag == 0 and macd < 0:
                flag = 1
        content_arr = []
        if (change_list == 0):
            print(code + '未出现形态拐点')
            check_out_list.append(s_info)
            continue
        # 找到最新的一个change
        last_change = {}
        change_list.reverse()
        for macd_info in change_list:
            if macd_info['form'] == '/':
                if 'end_date' not in last_change.keys():
                    macd_info['end_date'] = date_util.get_date_str()
                else:
                    macd_info['end_date'] = last_change['end_date']
                last_change = macd_info
                break
            elif macd_info['form'] == '\\':
                last_change['end_date'] = macd_info['rq']
        if 'form' not in last_change.keys():
            check_out_list.append(s_info)
            print(code + name + '未出现过这种形态')
            continue
        beg_date = last_change['rq']
        end_date = last_change['end_date']
        beg_date = beg_date[0:8] + '01'
        day_ks = k_util.day_ks_gap(code, beg_date, end_date)  # day_ks 日期顺序需要 从小到大
        # 写入excel
        add_flag = 0
        buy_price = 0
        for day_k in day_ks:
            day_k = json_util.to_json(day_k)
            rq = day_k['rq']
            if add_flag == 1:
                row = []
                row.append(code)
                row.append(name)
                row.append(beg_date)
                row.append(rq)
                row.append(buy_price)
                row.append(float(day_k['sp']))
                row.append(round((float(day_k['sp']) - buy_price) / buy_price * 100, 2))
                content_arr.append(row)
            else:
                m_macd_list = macd_util_v1.get_macd_list_his(code, rq, 1, 30)
                if json_util.to_json(m_macd_list[0])['macd'] > 0:
                    add_flag = 1
                    beg_date = rq
                    buy_price = float(day_k['sp'])
        # excel_util.gen_an_excel(result_path, code, '', content_arr)
        row_num = len(content_arr)
        if row_num == 0:
            print(code + name + 'content_arr长度为0')
            check_out_list.append(s_info)
            continue
        max_price = 0
        max_row = 0
        # content_arr = [['0编码', '1名称', '2开始日期', '3当前日期', '4买入价格', '5现在价格', '6目前涨幅']]
        for i in range(row_num):
            row = content_arr[i]
            if max_price < float(row[5]):
                max_price = float(row[5])
                max_row = i
        if row_num <= max_row:
            print(code + '出现长度倒挂')
            check_out_list.append(s_info)
            continue
        max_row = content_arr[max_row]
        name = max_row[1]
        beg_rq = max_row[2]
        max_rq = max_row[3]
        buy_price = max_row[4]
        max_zf = max_row[6]
        dif_days = date_util.diff_days_str(beg_rq, max_rq)
        speed = round(max_zf / dif_days, 4)
        if not os.path.exists(os.path.join(result_path, '000000.xlsx')):
            content_arr = [['编码', '名称', '开始日期', '结束日期', '买入价格', '最高价格', '最高涨幅', '操作天数', '上涨速度']]
            excel_util.gen_an_excel(result_path, '000000', '', content_arr)
        row_info = []
        row_info.append(code)
        row_info.append(name)
        row_info.append(beg_rq)
        row_info.append(max_rq)
        row_info.append(buy_price)
        row_info.append(max_price)
        row_info.append(max_zf)
        row_info.append(dif_days)
        row_info.append(speed)
        excel_util.add_n_row(os.path.join(result_path, '000000.xlsx'), '', [row_info])
    doc_util.gen_new_doc(result_path, '999999', check_out_list)


if __name__ == '__main__':
    stock_list = [
        # {'code': '002594', 'name': '比亚迪'},
        # {'code': '600660', 'name': '福耀玻璃'},
        # {'name': '上海机场', 'code': '600009', 'exchange': '1'},
        # {'name': '招商银行', 'code': '600036', 'exchange': '1'},
        # {'code': '600859', 'name': '王府井'},
        # {'name': '三一重工', 'code': '600031', 'exchange': '1'},
        # {'name': '金牛化工', 'code': '600722', 'exchange': '1'},
        # {'name': '徐工机械', 'code': '000425', 'exchange': '0'},
        # {'name': '紫金矿业', 'code': '601899', 'exchange': '1'},
        # {'name': '山东玻纤', 'code': '605006', 'exchange': '1'},
        # {'name': '华谊集团', 'code': '600623', 'exchange': '1'},
        # {'name': '海尔施', 'code': '601206', 'exchange': '1'},
        {'name': '中信证券', 'code': '600030', 'exchange': '1'},
    ]
    # month_macd_validation(stock_list)
    month_macd_valid(stock_list)
